|
Date : 13 juillet 1991 Protection : MOT DE PASSE Programme : THE CURSE OF RA Outils : SOFT-ICE V2.50a Fichier : FRED3.COM Temps pass� : 2 HEURES environ... Soci�t� : RAINBOW ARTS Divers : Cr�ation du fichier FRED3.COM Origine : INDONESIE Num�ro : 107 Un saut qui tape � l'oeil puisque l'on rep�re tout de suite une case m�moire dans laquelle on plave un 1 et qui autrement contient 0. C'est classique � la sortie d'un test dans les protections type mot de passe. CS:1A81 3A04 CMP AL,[SI] CS:1A83 7405 JZ 1A8A CS:1A85 C606550001 MOV BYTE PTR [0055],01 CS:1A8A E9E0F6 JMP 116D Dans le cas d'une mauvaise r�ponse on place 01 dans DS:0055. Ce serait presque trop facile si ce n'�tait que cette chaine n'apparait dans aucun fichier du programme !. Je regarde � l'oeil nu le header de RA.COM et que vois-je ? Un programme certe compact� mais ni par LZEXE, ni par PKLITE. Donc il ne reste que l'ultime solution de d�tourner une interruption pour aller modifier le programme � cet endroit. Je passe le jeu � QUAID avec un blocage sur l'INT 21 et je m'aper�ois que la sous-fonction GET TIME ( 2Ch ) est appel�e � chaque fois avant que le soft ne demande le mot de passe. Il ne reste plus qu'� adapter un de mes FRED?.COM dans lequel il suffira de rechercher le segment CS qui contiendra 74 en 1A83 ou bien 01 en 1A89 en popant le pointeur de pile. Ci-dessous le programme FRED3.COM qui intercepte la fonction GET TIME de l'INT 21. ; PATCH POUR LE PROGRAMME CURSE OF RA 13 Juillet 1991 ; FREDDY_SOFT code segment org 100h assume cs:code start: jmp installe ; On va installer la routine r�sidente... cr equ 0dh lf equ 0ah flag equ 02Ch adr_ip equ 1A89h ; En CS:1A89 il suffit de mettre 0. patch equ 0 ; � mettre � la place de 01 en CS:1A89h instok db cr,lf,' D�tournement de l',39,'INT 21 sous-fonction 2C' db cr,lf db ' ....FREDDY_SOFT....','$' drap db 0,0 elimine db cr,lf,'J',39,'ai en principe tout remis en l',39,'�tat....' db cr,lf,'$' int21 label dword ; sauvegarde des adresses SEG:OFF de l'INT21 d'origine i40off db 0,0 ; OFFSET i40seg db 0,0 ; SEGMENT tsrint40 proc far jmp short apr�s_id db 'FR' ; On intercalle au d�but du code un identificateur apr�s_id: sti ; qui permettra de savoir si le programme est l� ! nop push ds ; On sauve tout, sinon bonjour... push es ; push di push si push dx push cx push bx push ax cmp byte ptr [drap],1 ; Si 1 on devient transparent. jz suite ; Saut � l'INT 21 toutes fonctions valid�es. cmp ah,flag ; AH = 2C. jnz suite ; Si non on traite les INT 21 normalement. mov ax,sp ; On sauve le pointeur dans AX. incr: pop ds ; On pop le contenu de SP dans DS ce qui permet de ; modifier plus facilement un octet qui se trouve en CS cmp byte ptr ds:[adr_ip],1 jnz incr ; Tant que l'on a pas trouv� le bon SEGMENT on POP. mov byte ptr ds:[adr_ip],patch ; Si oui on patche... mov byte ptr [drap],1h ; Et on n'y revient plus..... mov sp,ax ; On replace la valeur d'origine dans SP. suite: pop ax ; On n'oublie pas de restaurer toute la m�canique... pop bx ; pop cx ; pop dx ; pop si pop di pop es pop ds pushf ; Pushf et puis un CALL pour appeler l'INT 21 ceci cli ; pour simuler une instruction INT. call int21 ; Appel de l'INT21 officielle. fin: sti ret 2 ; et on revient tsrint40 endp eor: ; ROUTINE D'INSTALLATION installe: mov ax,3521h int 21h cmp word ptr es:[bx+2],'RF' ; On teste la pr�sence de la signature. je away ; si pr�sent on d�sinstalle. mov ax,cs ; CS --> DS mov ds,ax ; DS = CS mov ax,3521h ; on detourne l'int 21h. int 21h ; sous-fonction 35. mov word ptr [i40off],bx ; L'offset se retrouve en BX. mov i40seg,es ; Le segment en ES. mov ax,2521h ; Et on met l'ad. du resident mov dx,offset tsrint40 ; sous-fonction 25 dont SEG:OFF se int 21h ; trouve en DX <---( tsrint40 ). mov dx,offset instok ; Offset du message de fin. mov ah,09 ; Sorti du message... int 21h mov ah,07 ; Attente d'un caract�re au clavier. int 21h mov dx,eor-start+100h+15 ; On r�serve la m�moire qui doit rester mov cl,4 ; en r�sident: DEBUT code - FIN code + shr dx,cl ; 100h + 15. ( 100h car les zones data mov al,0 ; sont plac�es de 0 � 100h dans un com. ; Puis d�calage de 4 � droite pour avoir ; le r�sultat en nombre de paragraphe ; + 1 ( ou + 15 comme ci-dessus ). mov ah,31h ; Sortie et reservation int 21h ; de la m�moire. away: mov dx,word ptr es:i40off ; Restauration de OFF:SEG de l'INT 21 mov ax,word ptr es:i40seg ; d'origine. mov ds,ax mov ax,2521h ; Set vecteur de l' INT 21 int 21h mov bx,es mov es,es:[2ch] mov ah,49h ; On lib�re la m�moire. int 21h mov es,bx mov ah,49h int 21h push cs ; Mettre CS dans DS pop ds mov dx,offset elimine ; pointe sur d�but du message. xor al,al mov ah,9 int 21h ; Sortir message. mov ah,4ch int 21h ; On revient au DOS. code ends end start |